package com.eps.tesoreria.DAO;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.transform.Transformers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.eps.DAO.SpringHibernateDAO;
import com.eps.TO.AnoTO;
import com.eps.TO.TipoTO;
import com.eps.entity.CuentaContable;
import com.eps.entity.Localidad;
import com.eps.entity.Parametros;
import com.eps.entity.Tipo;
import com.eps.entity.Zona;
import com.eps.tesoreria.Entity.ComprobanteCaja;
import com.eps.tesoreria.Entity.DetalleComprobanteCaja;
import com.eps.tesoreria.Entity.DetalleComprobanteCajaAsiento;
import com.eps.tesoreria.Entity.DetalleComprobanteCajaAsientoPK;
import com.eps.tesoreria.Entity.DetalleComprobanteCajaPK;
import com.eps.tesoreria.Entity.LiquidacionCobranza;
import com.eps.tesoreria.Entity.TipoComprobanteCaja;
import com.eps.tesoreria.TO.DetalleLiquidacionCobranzaTO;
import com.eps.tesoreria.TO.LiquidacionCobranzaTO;
import com.eps.tesoreria.TO.RendicionCajaChicaTO;
import com.eps.util.Utiles_Convertir;

@Repository
public class LiquidacionCobranzaHbDAO extends HibernateDaoSupport implements
		ILiquidacionCobranza {

	@Autowired
	private SpringHibernateDAO hdao;
	
	@Autowired
	private LiquidacionCobranzaJdbcDAO liquidacionjdbc;

	@Autowired
	public LiquidacionCobranzaHbDAO(SessionFactory sessionFactory) {
		super.setSessionFactory(sessionFactory);
		// TODO Auto-generated constructor stub
	}
	
	public boolean insertarLiquidacionCobranza(LiquidacionCobranzaTO liquidacion)
			throws Exception {
		// TODO Auto-generated method stub
		boolean retorno = false;
		Session session = getHibernateTemplate().getSessionFactory().openSession();
		
		Transaction tx = session.beginTransaction();
		tx.begin();
		try {
			Parametros param = hdao.getParametrosIDNativo("TE1");
			
	        String[] periodo = liquidacion.getFecha().split("/");
	        
			ComprobanteCaja comprobanteCaja = new ComprobanteCaja();
			comprobanteCaja.setFecha(new SimpleDateFormat("dd/MM/yyyy").parse(liquidacion.getFecha()));
	        comprobanteCaja.setGlosa("Liq.Cob."+liquidacion.getNro_liquidacion()/*((Localidad)session.get(Localidad.class, liquidacion.getId_localidad())).getNomLocalidad().trim()+"."+liquidacion.getFecha()*/);
	        comprobanteCaja.setReferente(((Localidad)session.get(Localidad.class, liquidacion.getId_localidad())).getNomLocalidad().trim());
	        comprobanteCaja.setTipoComprobante(getHibernateTemplate().get(TipoComprobanteCaja.class, 2));
	        comprobanteCaja.setAnio(/*param.getParam1()*/periodo[2]);
	        comprobanteCaja.setMes(/*param.getParam2()*/periodo[1]);
	        comprobanteCaja.setFlagCierre(true);
	        comprobanteCaja.setImporte(liquidacion.getImporte());
	        comprobanteCaja.setEstado_comprobante(this.getTipoCampoCodigo("tipo_Estado_CompCaja", "01").getId_tabla_tipo());
	        //comprobanteCaja.setIdZona(liquidacion.getId_zona());
	       // comprobanteCaja.setIdLocalidad(liquidacion.getId_localidad());
	        
	    	String codigo = liquidacionjdbc.getIdComprobanteCaja(comprobanteCaja);
	    	comprobanteCaja.setIdComprobanteCaja(codigo);
			
	    	
	    	//inserta liquidacion
	    	LiquidacionCobranza liq = new LiquidacionCobranza();
	    	liq.setIdComprobanteCaja(codigo);
	    	liq.setAnio(/*param.getParam1()*/periodo[2]);
	    	liq.setMes(/*param.getParam2()*/periodo[1]);
	    	liq.setIdZona(liquidacion.getId_zona());
	    	liq.setIdLocalidad(liquidacion.getId_localidad());
	    	liq.setFecha(new SimpleDateFormat("dd/MM/yyyy").parse(liquidacion.getFecha()));
	    	liq.setFechaOperacion(new Date());
	    	liq.setUsuario(liquidacion.getUsuario());
	    	liq.setImporte(liquidacion.getImporte());
	    	liq.setNroLiquidacion(liquidacion.getNro_liquidacion());
	    	
	    	session.persist(comprobanteCaja);
	    	session.persist(liq);
	    	session.flush();
	    	
	      //  List<DetalleComprobanteCaja> detalleComprobante = new ArrayList<DetalleComprobanteCaja>(1);
	        DetalleComprobanteCaja dc = new DetalleComprobanteCaja();
	        dc.setDetalleComprobanteCajaPK(new DetalleComprobanteCajaPK(comprobanteCaja.getIdComprobanteCaja(), 1));
	        dc.setDescripcion("Liquidacion de Cobranza."+((Localidad)session.get(Localidad.class, liquidacion.getId_localidad())).getNomLocalidad().trim()+"."+liquidacion.getFecha());
	        dc.setTipoDocumento(Utiles_Convertir.convertirToTipo_TipoTO(hdao.getTipoCampoCodigo("tipo_documento_caja", "03")));
	        dc.setIdZona(new Zona(liquidacion.getId_zona()));
	        dc.setIdLocalidad(new Localidad(liquidacion.getId_localidad()));
	        dc.setImporte(liquidacion.getImporte());
	        dc.setFecha_deposito(new SimpleDateFormat("dd/MM/yyyy").parse(liquidacion.getFecha()));
	        
	      //agrego para poner estado inicial
	        Tipo tipo = Utiles_Convertir.convertirToTipo_TipoTO(this.getTipoCampoCodigo("tipo_Estado_CompCaja", "01"));
            dc.setEstadoDetalleComprobante(tipo.getIdTablaTipo());
            dc.setCorr_comprobante_ref(0);
	        
	        session.persist(dc);
	        session.flush();
	      //  List<DetalleComprobanteCajaAsiento> dca = new ArrayList<DetalleComprobanteCajaAsiento>(1);
	        List<DetalleLiquidacionCobranzaTO> detallesTO = liquidacion.getDetalle().get("detalle");
	        int i=1;
	        for (DetalleLiquidacionCobranzaTO detalleto : detallesTO) {
	        	DetalleComprobanteCajaAsiento da = new DetalleComprobanteCajaAsiento();
	            da.setDetalleComprobanteCajaAsientoPK(new DetalleComprobanteCajaAsientoPK(comprobanteCaja.getIdComprobanteCaja(), 1,i++));
	            da.setIdCuentaContable(new CuentaContable(detalleto.getCuenta_contable()));
	            da.setMontoDebe(detalleto.getMonto_debe());
	            da.setMontoHaber(detalleto.getMonto_haber());
	         //   dca.add(da);
	            session.persist(da);
	            
	        }
	        //dc.setDetalleComprobanteCajaAsientoList(dca);
	        //detalleComprobante.add(dc);
	        //comprobanteCaja.setDetalleComprobanteCajaList(detalleComprobante);
	        
	        
	        session.flush();
			tx.commit();
			retorno = true;
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
			throw e;
		}

		return retorno;

	}
	
	public TipoTO getTipoCampoCodigo(String campo, String codigo)
	throws Exception {
		Session session = getHibernateTemplate().getSessionFactory()
				.openSession();
		Query consulta = session
				.createSQLQuery(
						"SELECT id_tabla_tipo AS id_tabla_tipo, convert(varchar(25),tabla) AS tabla, convert(varchar(25), descripcion_campo) AS descripcion_campo, convert( varchar(10),codigo) AS codigo, descripcion_valor AS descripcion_valor FROM Tipo where ltrim(descripcion_campo)='"
								+ campo
								+ "' and ltrim(codigo)='"
								+ codigo
								+ "'").setResultTransformer(
						Transformers.aliasToBean(TipoTO.class));
		;
		return (TipoTO) consulta.list().get(0);
	}
	
	public List<LiquidacionCobranzaTO> getLiquidacionesPorZona(String id_zona,String id_localidad,String anio,String mes) throws Exception  {
			Session session = getHibernateTemplate().getSessionFactory().openSession();
			Query consulta = session.createSQLQuery(
							" select convert(varchar,id_comprobante_caja) as id_comprobante_caja,convert(varchar(10),fecha,103) as fecha,convert(varchar(10),fecha_operacion,103) as fecha_operacion,convert(varchar,rtrim(usuario))as usuario,importe,convert(varchar,nro_liquidacion)as nro_liquidacion"
			                + " from liquidacion_cobranza "
			                + " where anio = " + anio + " and mes = " + mes +" and id_zona = "+ id_zona +" and id_localidad = "+ id_localidad + "order by fecha desc").setResultTransformer(
							Transformers.aliasToBean(LiquidacionCobranzaTO.class));
			return consulta.list();
	}
	
	public List<DetalleLiquidacionCobranzaTO> getDetalleLiquidacionCobranza(String id_liquidacion) throws Exception  {
		Session session = getHibernateTemplate().getSessionFactory().openSession();
		Query consulta = session.createSQLQuery(
						" SELECT detalle_comprobante_caja_asiento.correl_asiento as correlativo,convert(varchar, detalle_comprobante_caja_asiento.id_cuenta_contable) as cuenta_contable, "+
                        " detalle_comprobante_caja_asiento.monto_debe, detalle_comprobante_caja_asiento.monto_haber, cuenta_contable.desc_cuenta "+
                      	" FROM detalle_comprobante_caja_asiento INNER JOIN "+
                        " cuenta_contable ON detalle_comprobante_caja_asiento.id_cuenta_contable = cuenta_contable.id_cuenta_contable "+
		                " where detalle_comprobante_caja_asiento.id_Comprobante_caja = '" + id_liquidacion + "'").setResultTransformer(Transformers.aliasToBean(DetalleLiquidacionCobranzaTO.class));
		return consulta.list();
	}
	 

}
